#include "printf_test.h"
#include "printf.h"
#include "console.h"
#include "ansi_escapes.h"

// printf功能测试套件
// 验证各种格式化输出和边界条件

void test_basic_printf(void)
{
    printf("=== 基本printf测试 ===\n");
    
    // 基本字符串输出
    printf("Hello, World!\n");
    printf("字符串测试: %s\n", "riscv-os");
    printf("字符测试: %c\n", 'A');
    printf("百分号测试: %%\n");
    for (int i = 0; i < 1000000000; i++)
    {
        /* code */
    }
    
}

void test_integer_formats(void)
{
    printf("\n=== 整数格式测试 ===\n");
    
    // 十进制测试
    printf("正数: %d\n", 42);
    printf("负数: %d\n", -42);
    printf("零: %d\n", 0);
    
    // 十六进制测试
    printf("十六进制: %x\n", 255);
    printf("十六进制大数: %x\n", 0xDEADBEEF);
    
    // 无符号数测试
    printf("无符号数: %u\n", 4294967295U);

    for (int i = 0; i < 1000000000; i++)
    {
        /* code */
    }
    
}

void test_boundary_conditions(void)
{
    printf("\n=== 边界条件测试 ===\n");
    
    // INT_MIN和INT_MAX测试
    printf("INT_MIN: %d\n", -2147483647-1);  // 避免编译器警告
    printf("INT_MAX: %d\n", 2147483647);
    
    // 长整型测试
    printf("长整型: %ld\n", 9223372036854775807LL);
    printf("长整型负数: %ld\n", -9223372036854775807LL-1);  // 避免编译器警告
    
    // 指针测试
    int x = 42;
    printf("指针: %p\n", &x);
    
    // NULL指针测试
    printf("NULL字符串: %s\n", (char*)0);

    for (int i = 0; i < 1000000000; i++)
    {
        /* code */
    }
    
}

void test_format_edge_cases(void)
{
    printf("\n=== 格式边界测试 ===\n");
    
    // 连续格式符
    printf("连续格式: %d %d %d\n", 1, 2, 3);
    
    // 混合格式
    printf("混合: %s有%d个%c，十六进制是%x\n", "测试", 10, 'A', 10);
    
    // 未知格式符测试
    printf("未知格式: %z %q\n");
    
    // 格式字符串结尾是%
    printf("结尾百分号: test%");
    printf("\n");

    for (int i = 0; i < 1000000000; i++)
    {
        /* code */
    }
    
}

void test_number_conversion_algorithm(void)
{
    printf("\n=== 数字转换算法测试 ===\n");
    
    // 各种进制测试
    printf("二进制模拟(用十六进制): %x\n", 0b11111111); // 如果支持
    printf("八进制模拟(用十六进制): %x\n", 0377);
    
    // 大数测试
    printf("大十六进制数: %lx\n", 0x123456789ABCDEFLL);
    
    // 小数测试（如果实现了）
    printf("零值各种格式: %d %x %u\n", 0, 0, 0);
    
    // 单位数测试
    for (int i = 0; i < 10; i++) {
        printf("%d ", i);
    }
    printf("\n");
    
    // 十六进制字母测试
    for (int i = 10; i < 16; i++) {
        printf("%x ", i);
    }
    printf("\n");

    for (int i = 0; i < 1000000000; i++)
    {
        /* code */
    }
    
}

void test_console_features(void)
{
    printf("\n=== 控制台功能测试 ===\n");

    //颜色测试
    printf("颜色测试开始:\n");
    printf(TEXT_BOLD FG_RED "这是加粗的红色文字" RESET_ALL "\n");
    printf(FG_GREEN BG_YELLOW "这是绿色文字黄色背景" RESET_ALL "\n");
    printf(TEXT_UNDERLINE FG_BLUE "这是带下划线的蓝色文字" RESET_ALL "\n");
    printf(TEXT_INVERT "这是反色显示的文字" RESET_ALL "\n");
    printf("\n");
    
    //测试成功，不方便展示，注释
    // // 光标定位测试
    // printf("光标定位测试:\n");
    // set_cursor_position(10, 5);
    // printf("定位文本");
    // set_cursor_position(0, 7);
    // printf("回到左边\n");
    
    // // 清行测试
    // printf("这行将被清除...");
    // clear_line();
    // printf("清除完成\n");

    for (int i = 0; i < 1000000000; i++)
    {
        /* code */
    }
    
}

void test_performance(void)
{
    printf("\n=== 性能测试 ===\n");
    
    // 大量输出测试
    printf("大量数字输出测试:\n");
    for (int i = 0; i < 100; i++) {
        if (i % 10 == 0) printf("\n");
        printf("%d ", i);
    }
    printf("\n");
    
    // 长字符串测试
    printf("长字符串测试: ");
    for (int i = 0; i < 50; i++) {
        printf("*");
    }
    printf("\n");

    for (int i = 0; i < 1000000000; i++)
    {
        /* code */
    }
    
}

void test_error_handling(void)
{
    printf("\n=== 错误处理测试 ===\n");
    
    // 这些测试应该不会崩溃系统
    printf("NULL指针处理: %s\n", (char*)0);
    printf("空字符串: %s\n", "");
    
    // 格式不匹配测试（注意：这可能导致未定义行为）
    printf("格式测试完成\n");

    for (int i = 0; i < 1000000000; i++)
    {
        /* code */
    }
    
}

// 主测试函数
void run_printf_tests(void)
{
    printf("\n");
    printf("========================================\n");
    printf("       RISCV-OS Printf 测试套件        \n");
    printf("========================================\n");

    test_console_features();
    test_basic_printf();
    test_integer_formats();
    test_boundary_conditions();
    test_format_edge_cases();
    test_number_conversion_algorithm();
    test_performance();
    test_error_handling();
    
    printf("\n========================================\n");
    printf("           测试完成！                   \n");
    printf("========================================\n");
}

// 清屏功能演示
void demo_clear_screen(void)
{
    printf("清屏演示 - 3秒后清屏...\n");
    
    // 简单延时（在实际系统中应该使用定时器）
    for (volatile int i = 0; i < 10000000; i++) {
        // 空循环延时
    }
    
    clear_screen();
    printf("屏幕已清除！\n");
    printf("清屏功能正常工作。\n");
}